package com.study.demo.components.jockeyjs.util;

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public abstract class ForwardingWebViewClient extends WebViewClient {

  protected abstract WebViewClient delegate();

  protected boolean hasDelegate() {
    return delegate() != null;
  }

  @Override
  public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
    if (hasDelegate()) {
      delegate().doUpdateVisitedHistory(view, url, isReload);
    } else {
      super.doUpdateVisitedHistory(view, url, isReload);
    }
  }

  @Override
  public void onFormResubmission(WebView view, Message dontResend, Message resend) {
    if (hasDelegate()) {
      delegate().onFormResubmission(view, dontResend, resend);
    } else {
      super.onFormResubmission(view, dontResend, resend);
    }
  }

  @Override
  public void onLoadResource(WebView view, String url) {
    if (hasDelegate()) {
      delegate().onLoadResource(view, url);
    } else {
      super.onLoadResource(view, url);
    }
  }

  @Override
  public void onPageFinished(WebView view, String url) {

    if (hasDelegate()) {
      delegate().onPageFinished(view, url);
    } else {
      super.onPageFinished(view, url);
    }
  }

  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {

    if (hasDelegate()) {
      delegate().onPageStarted(view, url, favicon);
    } else {
      super.onPageStarted(view, url, favicon);
    }
  }

  @Override
  public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    if (hasDelegate()) {
      delegate().onReceivedError(view, errorCode, description, failingUrl);
    } else {
      super.onReceivedError(view, errorCode, description, failingUrl);
    }
  }

  @Override
  public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,
                                        String realm) {

    if (hasDelegate()) {
      delegate().onReceivedHttpAuthRequest(view, handler, host, realm);
    } else {
      super.onReceivedHttpAuthRequest(view, handler, host, realm);
    }
  }

  @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) @Override
  public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
    if (hasDelegate()) {
      delegate().onReceivedLoginRequest(view, realm, account, args);
    } else {
      super.onReceivedLoginRequest(view, realm, account, args);
    }
  }

  @Override
  public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    if (hasDelegate()) {
      delegate().onReceivedSslError(view, handler, error);
    } else {
      super.onReceivedSslError(view, handler, error);
    }
  }

  @Override
  public void onUnhandledKeyEvent(WebView view, KeyEvent event) {

    if (hasDelegate()) {
      delegate().onUnhandledKeyEvent(view, event);
    } else {
      super.onUnhandledKeyEvent(view, event);
    }
  }

  @Override
  public void onScaleChanged(WebView view, float oldScale, float newScale) {

    if (hasDelegate()) {
      delegate().onScaleChanged(view, oldScale, newScale);
    } else

    {
      super.onScaleChanged(view, oldScale, newScale);
    }
  }

  @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override
  public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    if (hasDelegate()) {
      return delegate().shouldInterceptRequest(view, url);
    } else {
      return super.shouldInterceptRequest(view, url);
    }
  }

  @Override
  public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
    if (hasDelegate()) {
      return delegate().shouldOverrideKeyEvent(view, event);
    } else {
      return super.shouldOverrideKeyEvent(view, event);
    }
  }
}
